import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import javax.swing.JTextArea;
/**
 * 
 * @author Francisco Vallejo
 *
 */
public class DataBase {
	ArrayList alumnos = new ArrayList<>();
	String ruta = "C:/alumnos.dat";
	File fileInUse;

	public File getFileInUse() {
		return fileInUse;
	}

	public void setFileInUse(File fileInUse) {
		this.fileInUse = fileInUse;
	}

	public ArrayList getAlumnos() {
		return alumnos;
	}

	public void setAlumnos(ArrayList alumnos) {
		this.alumnos = alumnos;
	}

	public DataBase() {
		fileInUse = new File(ruta);
		if (!fileInUse.exists()) {
			try {
				fileInUse.createNewFile();
			} catch (IOException e) {
			}
		}
//		if(fileInUse.length() != 0){
			setearAlumnos();
//		}
	}

	/**
	 * Metodo para buscar un alumno por su dni
	 * 
	 * @param dni
	 *            dni a buscar
	 * @return devuelve el alumno encontrado, en caso de no encontrarlo devuelve
	 *         null
	 */
	public Alumno buscarAlumno(String dni) {
		for (int i = 0; i < this.alumnos.size(); i++) {
			Alumno aux = (Alumno) alumnos.get(i);
			if (aux.getDni().equalsIgnoreCase(dni)) {
				return aux;
			}
		}
		return null;
	}

	/**
	 * Metodo para Guardar los datos modificados en el fichero base de datos
	 */
	public void guardarDatos() {
		File fileAux = new File(this.fileInUse.getAbsolutePath());
		FileOutputStream fileOut;
		ObjectOutputStream objectOut = null;
		try {
			fileOut = new FileOutputStream(fileAux);
			objectOut = new ObjectOutputStream(fileOut);
			for (int i = 0; i < this.alumnos.size(); i++) {
				Alumno alumnoAuxiliar = (Alumno) this.alumnos.get(i);
				objectOut.writeObject(alumnoAuxiliar);
			}
			objectOut.close();
		} catch (FileNotFoundException e) {
		} catch (IOException er) {
		}

		this.fileInUse.delete();
		try {
			fileAux.createNewFile();
			this.setFileInUse(fileAux);
			System.out.println("...Cambios realizados correctamente...");
		} catch (IOException e) {
		}
	
	}

	/**
	 * Metodo para Cargar la lista de alumnos existente en el fichero
	 */
	public void setearAlumnos() {
		Alumno aux = null;
		for(int i = 0; i<this.alumnos.size();i++){
			alumnos.remove(i);
		}
		try {
			fileInUse.setReadable(true);
			FileInputStream fileIn = new FileInputStream(fileInUse);
			DataInputStream dataIn = new DataInputStream(fileIn);
			try {
				ObjectInputStream objIn = new ObjectInputStream(dataIn);
				while (true) {
					aux = (Alumno) objIn.readObject();
					this.alumnos.add(aux);
				}
			} catch (EOFException e) {
				System.out.println("Leido correctamente");
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Metodo para guardar un nuevo objeto alumno en el fichero en uso
	 * 
	 * @param alumnoAux
	 */
	public void insertarAlumno(Alumno alumnoAux) {
		Alumno auxiliar = buscarAlumno(alumnoAux.getDni());
		if(auxiliar == null)this.alumnos.add(alumnoAux);
		else System.out.println("alumno repetido");
	}

	/**
	 * Metodo para modificar un alumno existente dentro de el archivo en uso
	 * 
	 * @param dni
	 *            dni a buscar
	 * @param dni
	 *            dni de el alumno
	 * @param nombre
	 *            nuevo nombre de el alumno
	 * @param poblacion
	 *            nueva poblacion de el alumno nuevo
	 * @param telefono
	 *            nuevo telefono de el alumno nuevo
	 * @param fecha
	 *            nueva fecha de ingreso de el alumno nuevo
	 * @param carrera
	 *            nueva carrera de el alumno nuevo
	 * @return devuelve true en caso de encontrar el alumno y modificarlo, en
	 *         cualquier caso contrario devuelve falso
	 */
	public boolean modificarAlumno(String dni, String nombre, String poblacion,
			int telefono, String fecha, String carrera) {
		Alumno auxiliar = this.buscarAlumno(dni);
		if (auxiliar != null) {
			auxiliar.setNombre(nombre);
			auxiliar.setPoblacion(poblacion);
			auxiliar.setTelefono(telefono);
			auxiliar.setFecha(fecha);
			auxiliar.setCarrera(carrera);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Metodo para eliminar un alumno de la lista actual
	 * 
	 * @param dni
	 *            de el alumno a eliminar
	 * @return devuelve true en caso de eliminar al alumno y false en caso de no
	 *         eliminarlo pro cualquier motivo
	 */
	public boolean eliminarAlumno(String dni) {
		Alumno aux = buscarAlumno(dni);
		if (aux != null) {
			this.alumnos.remove(aux);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Metodo para buscar alumnos de la misma carrera
	 * 
	 * @param carrera
	 *            Carrera la cual buscaremos
	 * @return devuelve el ArrayList con los alumnos de la misma carrera sino
	 *         devuelve la lista vacia
	 */
	public ArrayList<Alumno> mostrarAlumnosPorCarrera(String carrera) {
		setearAlumnos();
		ArrayList<Alumno> alumnosPorCarrera = new ArrayList<Alumno>();
		for (int i = 0; i < alumnos.size(); i++) {
			Alumno aux = (Alumno) alumnos.get(i);
			if (aux.getCarrera().equalsIgnoreCase(carrera)) {
				alumnosPorCarrera.add(aux);
			}
		}
		return alumnosPorCarrera;
	}

}
